package com.aop;

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
import java.sql.Array;
import java.util.Arrays;

public class ComputerProxy {
	// 要代理的对象
	private Computer computer;
	
	public  ComputerProxy(Computer computer) {
		this.computer = computer;	 
	}

	public Computer getLoggingProxy() {
		Computer proxy = null;
		
		ClassLoader loader = computer.getClass().getClassLoader();
		Class[] interfaces = new Class[] {Computer.class};
		InvocationHandler h = new InvocationHandler() {
			/**
			 * proxy:正在返回的那个代理对象，一般情况下，在invoke方法中都不使用该对象。
			 * method：正在被调用的方法
			 * args：调用方法时，传入的参数
			 */
			@Override
			public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
				String methodName = method.getName();
				System.out.println("方法：>" + methodName + ":参数：" + Arrays.asList(args));
				Object result = method.invoke(computer, args);
				System.out.println("结果为" + result);
				return result;
			}
		};
		proxy = (Computer) Proxy.newProxyInstance(loader, interfaces, h);
		
		return proxy;
	}

}
